#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "ponto.h"

using namespace std;
//construtor default
//------------------------------------------------------------------------------
Ponto::Ponto(){
      dimnum  = grupopertencente = rotulo = 0;  
      coordenada = NULL;
      distancia = NULL;
               
}
//------------------------------------------------------------------------------

//segundo construtor
//------------------------------------------------------------------------------
Ponto::Ponto(int dim,int numcent){
      dimnum = dim; 
      grupopertencente = 0; 
      rotulo = 0;
      coordenada = new float[dimnum]; 
      
      distancia = new double[numcent];        
}
//------------------------------------------------------------------------------

//mostra as coordenadas do ponto na tela
//------------------------------------------------------------------------------
void Ponto::MostraPonto(){
     
     for(int i=0;i<dimnum;i++)
        cout << coordenada[i] << ",";
        
     cout << endl;
     
}
//------------------------------------------------------------------------------

//permite que o usuario defina o numero de dimensoes do ponto
//------------------------------------------------------------------------------
void Ponto::GetDim(){
     cout << "Insira o numero de dimensoes do ponto: " ;
     cin >> dimnum;     
     coordenada = new float[dimnum];
}
//------------------------------------------------------------------------------

//insere as dimensoes do ponto
//------------------------------------------------------------------------------
void Ponto::InsereDim(int n){
     dimnum = n;
     coordenada = new float[dimnum];
}
//------------------------------------------------------------------------------

//seta o ponto em um dos grupos existentes
//------------------------------------------------------------------------------
void Ponto::InsereGrupo(int n){
     grupopertencente = n;
}
//------------------------------------------------------------------------------

//retorna o grupo ao qual ele pertence
//------------------------------------------------------------------------------
int Ponto::RetornaGrupo(){
 return grupopertencente;               
}
//------------------------------------------------------------------------------

//retorna o numero de dimensoes do ponto
//------------------------------------------------------------------------------
int Ponto::RetornaDim(){
 return dimnum;               
}
//------------------------------------------------------------------------------

//mostra o grupo ao qual o ponto pertence
//------------------------------------------------------------------------------
void Ponto::MostraGrupo(){
     cout << "Grupo: " << grupopertencente << endl;
}
//------------------------------------------------------------------------------

//informa ao ponto o numero de centroides existentes
//------------------------------------------------------------------------------
void Ponto::InsertNumCent(int numcent){
     distancia = new double[numcent];
}
//------------------------------------------------------------------------------

//mostra as distancias do ponto em relacao aos centroides
//------------------------------------------------------------------------------
void Ponto::MostraDistancias(int numcent){
     int temp=0;

     for(int i=0;i<numcent;i++)
      cout << "\t" << "centroide: " << i << ": distancia: " << distancia[i] << endl;
     
     temp = GetMenorDistancia(numcent);
     cout << "\tMenor Distancia: " << distancia[temp] << " :Centroide: " << temp << endl;

}
//------------------------------------------------------------------------------

//retorna a menor distancia entre o ponto e o centroide
//------------------------------------------------------------------------------
int Ponto::GetMenorDistancia(int numcent){
    int temp = numcent;
    double d = 1000000;
    
    for(int i=0;i<numcent;i++)
      if(distancia[i] < d){
       temp = i; 
       d = distancia[i];
      }

    return temp;
}
//------------------------------------------------------------------------------

//seta um rotulo no ponto, para identifica-lo
//------------------------------------------------------------------------------
void Ponto::SetRotulo(int r){
     rotulo = r;     
}
//------------------------------------------------------------------------------

//retorna o rotulo do ponto
//------------------------------------------------------------------------------
int Ponto::GetRotulo(){
    return rotulo;
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
